package com.victor.controller.app;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import javax.smartcardio.Card;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.victor.entity.CardPhoto;
import com.victor.entity.JMInfo;
import com.victor.entity.JMPhoto;
import com.victor.entity.User;
import com.victor.entity.UserFeedback;
import com.victor.service.MyselfService;
import com.victor.utils.CodeUtil;
import com.victor.utils.Msg;

/**
 * app端我的模块
 * 
 * @author zhangbin
 *
 */
@RestController
@RequestMapping("/myself")
public class MyselfController {

	@Autowired
	private MyselfService myselfService;

	// 定义定时器
	private Timer timer = new Timer();

	// 定义验证码list
	private static List<Map<String, Object>> codelist = new ArrayList<Map<String, Object>>();

	/**
	 * 订单
	 */

	/**
	 * 我的基本信息
	 */

	/**
	 * 修改用户基本信息 根据id
	 * 
	 * @param user
	 * @return
	 */
	@RequestMapping("/update")
	public Msg update(User user) {
		if (user.getId() == null) {
			return Msg.fail("参数错误");
		}
		boolean b = myselfService.updateUser(user);
		return Msg.judge(b);
	}

	/**
	 * 我的必备
	 */

	/**
	 * 合作加盟 ( 必须携带当前登陆人,登录人id) zongclass入住加盟总类型0美食商家入驻 1宾馆商家入驻 2旅游景区商家入驻 3休闲娱乐商家入驻 (
	 * 必须携带值 )
	 * 
	 * @param enterbrandmation
	 * @return
	 */
	@RequestMapping("/submitJionMessage")
	public Msg submitJionMessage(@RequestBody JMInfo jmInfo, String code) {
		if (jmInfo == null || jmInfo.getUsername() == null || jmInfo.getUserid() == null
				|| jmInfo.getZongclass() == null || jmInfo.getPhone().length()==0) {
			return Msg.fail("参数错误");
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
		jmInfo.setDate(df.format(new Date()));// new Date()为获取当前系统时间

		// 美食入驻不需要手机验证码，所以此范围内是直接添加
		if (jmInfo.getZongclass().equals("0")) {
			boolean b = myselfService.submitJMInfo(jmInfo);// 提交加盟信息
			if (!b) {
				return Msg.fail("添加失败");
			}
			if (jmInfo.getPhotos() != null) {
				for (int i = 0; i < jmInfo.getPhotos().size(); i++) {
					jmInfo.getPhotos().get(i).setInfoid(String.valueOf(jmInfo.getId()));
					boolean photos = myselfService.submitPhoto(jmInfo.getPhotos().get(i));// 提交加盟加盟营业执照，经营许可证，环境等相关照片
																							// ，身份证，以及身份证正反面等
					if (!photos) {
						return Msg.fail("添加图片失败");
					}
				}
			}
			return Msg.success();
		}

		// 以下需要验证码判断的
		// 获取对象中的手机号
		String mobile = jmInfo.getPhone();
		if (mobile == null || code == null) {
			return Msg.fail("参数错误");
		}
		// 获取验证码
		String random = CodeUtil.getmapvalue(codelist, mobile);
		// 判断验证码是否正确
		if (code.equals(random)) {
			// 验证码用后失效
			Map<String, String> map = new HashMap<String, String>();
			map.put("mobile", mobile);
			map.put("random", random);
			codelist.remove(map);
			// 提交加盟信息
			boolean b = myselfService.submitJMInfo(jmInfo);
			if (!b) {
				return Msg.fail("添加失败");
			}
			if (jmInfo.getPhotos() != null) {
				for (int i = 0; i < jmInfo.getPhotos().size(); i++) {
					jmInfo.getPhotos().get(i).setInfoid(String.valueOf(jmInfo.getId()));
					boolean photos = myselfService.submitPhoto(jmInfo.getPhotos().get(i));// 提交加盟加盟营业执照，经营许可证，环境等相关照片
																							// ，身份证，以及身份证正反面等
					if (!photos) {
						return Msg.fail("添加图片失败");
					}
				}
				return Msg.success();
			}
			return Msg.fail();
		}

		return Msg.fail();
	}

	/**
	 * 设置--修改密码 (原密码) 原密码用password字符串传递 新密码用user对象传递
	 * 
	 * @param user
	 * @param password
	 * @return
	 */
	@RequestMapping("/updatePassword")
	public Msg updatePasswordByPassword(User user, String ypassword) {
		if (user.getId() == null || user.getPassword() == null || user.getPassword().equals("") || ypassword == null) {
			return Msg.fail();
		}
		// 通过id获取数据库原密码
		User user1 = myselfService.getUserById(user.getId());

		// 判断前端传来的密码和后台的原密码是否相同
		if (ypassword.equals(user1.getPassword())) {
			boolean b = myselfService.updateUser(user);
			return Msg.judge(b);
		}
		return Msg.fail();
	}

	/**
	 * 设置--修改密码 (短信修改) 新密码用user传递 手机号用user传递
	 * 
	 * @param user
	 * @param code 验证码
	 * @return
	 */
	@RequestMapping("/updatePasswordByPhone")
	public Msg updatePasswordByPhone(User user, String code) {
		// 获取对象中的手机号
		String mobile = user.getPhone();
		if (user.getId() == null || user.getPassword() == null || user.getPassword().equals("") || mobile == null
				|| code == null) {
			return Msg.fail("参数错误");
		}

		// 获取验证码
		String random = CodeUtil.getmapvalue(codelist, mobile);
//			判断验证验证码是否正确 
		if (code.equals(random)) {

			// 验证码用后失效..
			Map<String, String> map = new HashMap<String, String>();
			map.put("mobile", mobile);
			map.put("random", random);
			codelist.remove(map);

			// 修改密码
			boolean b = myselfService.updateUser(user);
			return Msg.judge(b);
		}
		return Msg.fail();
	}

	/**
	 * 设置--修改支付密码 (原密码) 字符串传原支付密码 对象传新修改的密码
	 * 
	 * @param user
	 * @param id
	 * @return
	 */
	@RequestMapping("/updatePayPassword")
	public Msg updatePayPassword(User user, String ypaypassword) {
		if (user.getId() == null || user.getPaypassword() == null || user.getPaypassword().equals("")
				|| ypaypassword == null) {
			return Msg.fail("参数错误");
		}

		// 通过id获取数据库原密码
		User user1 = myselfService.getUserById(user.getId());
		if (ypaypassword.equals(user1.getPaypassword())) {
			boolean b = myselfService.updateUser(user);
			return Msg.judge(b);
		}
		return Msg.fail();
	}

	/**
	 * 设置--修改支付密码 (短信修改) 新支付密码由user传递 手机号由user传递
	 * 
	 * @param user
	 * @param code 验证码
	 * @return
	 */
	@RequestMapping("/updatePayPasswordByPhone")
	public Msg updatePayPasswordByPhone(User user, String code) {
		// 获取对象中的手机号
		String mobile = user.getPhone();
		if (user.getId() == null || user.getPaypassword() == null || user.getPaypassword().equals("") || user.getPhone()== null
				|| code == null) {
			return Msg.fail("参数错误");
		}

		// 获取验证码
		String random = CodeUtil.getmapvalue(codelist, mobile);
//			判断验证验证码是否正确 
		if (code.equals(random)) {

			// 验证码用后失效..
			Map<String, String> map = new HashMap<String, String>();
			map.put("mobile", mobile);
			map.put("random", random);
			codelist.remove(map);

			// 修改密码
			boolean b = myselfService.updateUser(user);
			return Msg.judge(b);
		}
		return Msg.fail();
	}

	/**
	 * 生成验证码 有效期2分钟
	 * 
	 * @param mobile
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/buildcode")
	public Msg buildcode(String mobile) throws Exception {
		if (mobile == null || mobile.equals("")) {
			return Msg.fail("手机号为空");
		}
		// 关闭timer
		timer.cancel();
		// new一个Timer
		timer = new Timer();

		Map<String, Object> m2 = new HashMap<String, Object>();
		// 生成验证码(6位随机的验证码)
		String random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
		System.out.println(mobile + " ~~~" + random);
		// 第三方发送短息 TODO
		// AliMobileCode.getMessage(mobile, random);
		// 删除该手机号在codelist中其他的验证信息
		CodeUtil.clearothermap(codelist, mobile);
		// 将随机验证码放入到全局map中
		m2.put("random", random);
		m2.put("mobile", mobile);
		codelist.add(m2);
		m2 = new HashMap<String, Object>();

		// 设置定时器2分钟清空mmmlist
		timer.schedule(new TimerTask() {
			public void run() {
				codelist.clear();
			}
		}, 2 * 60 * 1000);// 设定指定的时间time,此处为2*60*1000毫秒
		return Msg.success().add("code", random);
	}

	/** 问题反馈 
	 * 添加反馈信息
	 * @param userFeedbackClass
	 * @return
	 */
	@RequestMapping("/addfeedback")
	public Msg addFeedback(@RequestBody UserFeedback userFeedback) {
		if (userFeedback==null || userFeedback.getUserFeedbackPhotos()==null || userFeedback.getUserFeedbackPhotos().size()==0) {
			return Msg.fail("参数错误");
		}
		boolean b = myselfService.addfeedback(userFeedback);
		if (!b) {
			return Msg.fail("添加反馈信息失败");
		}
		for (int i = 0; i < userFeedback.getUserFeedbackPhotos().size(); i++) {
			userFeedback.getUserFeedbackPhotos().get(i).setFeedbackid(userFeedback.getId()+"");
			myselfService.addfeedbackPhoto(userFeedback.getUserFeedbackPhotos().get(i));
		}
		return Msg.success();
	}
}
